import logging

from PySide6.QtCore import Qt
from PySide6.QtWidgets import QSizePolicy, QGraphicsLinearLayout

from 程序核心代码.mvvm重构.基础定义.基础图形项.基础图形组件.子组件.基本文本组件.基础文本组件 import 对齐方式
from 程序核心代码.mvvm重构.基础定义.基础图形项.基础图形组件.子组件.基础文本组件 import 基础文本组件
from 程序核心代码.mvvm重构.基础定义.基础图形项.节点接口.接口图形项包装 import 接口图形项
from .带布局的节点图形项 import 带布局的节点基础图形项

# 配置日志记录器
logging.basicConfig(level=logging.WARNING, format='%(asctime)s - %(levelname)s - %(message)s')
日志记录器 = logging.getLogger(__name__)

class 带组件带布局的节点图形项(带布局的节点基础图形项):
    def __init__(self, 节点模型, 父容器节点图形项管理器,父项=None, ):
        self.调试模式 = False
        # 设置日志等级
        if self.调试模式:
            日志记录器.setLevel(logging.DEBUG)
            日志记录器.debug(f"{self.__class__.__name__}调试模式已开启")
        else:
            日志记录器.setLevel(logging.ERROR)  # 只显示警告及以上级别的日志

        日志记录器.info("初始化带组件带布局的节点图形项")
        super().__init__(节点模型,父容器节点图形项管理器, 父项)
        日志记录器.info("初始化带组件带布局的节点图形项完成")
        日志记录器.info("当前图形项具有属性：%s", self.图形项属性)
        self.加载组件()
        日志记录器.info("加载组件完成")

    def 加载组件(self):
        日志记录器.debug("开始加载组件")
        # 标题区必有
        self.加载标题区组件()
        日志记录器.debug("标题区组件加载完成")
        self.加载连接区组件()
        日志记录器.debug("连接区组件加载完成")
        self.加载介绍区组件()
        日志记录器.debug("介绍区组件加载完成")
        self.加载容器区组件()
        日志记录器.debug("容器区组件加载完成")
        self.重新排列节点布局()

    def 加载标题区组件(self):
        日志记录器.debug("加载标题区组件")
        # 标题区必有
        self.名称组件 = 基础文本组件(self.图形项属性.get('节点名称'))
        self.状态组件 = 基础文本组件(self.图形项属性.get('节点图形项管理状态') or '未检查节点状态')
        self.注册属性变动触发函数('节点标题名称', self.名称组件.设置文本)
        self.注册属性变动触发函数('节点图形项管理状态', self.状态组件.设置文本)
        self.状态组件.设置文本对齐方式(对齐方式.右对齐)
        self.标题区布局.addItem(self.名称组件)
        self.标题区布局.addItem(self.状态组件)
        self.标题区设置容器策略与高度(self.名称组件)
        self.标题区设置容器策略与高度(self.状态组件)
        日志记录器.info("标题区组件加载完成, 名称: %s, 状态: %s", self.图形项属性.get('节点名称'), self.图形项属性.get('节点图形项管理状态'))

    def 标题区设置容器策略与高度(self, 组件):
        日志记录器.debug("设置容器策略与高度")
        组件.设置容器大小策略(QSizePolicy.MinimumExpanding, QSizePolicy.Minimum)
        组件.setMaximumHeight(组件.文本图形项.boundingRect().size().height())

    def 加载介绍区组件(self):
        日志记录器.debug("加载介绍区组件")
        # 介绍区可选
        if not self.图形项属性.get('节点介绍') is None:
            if not hasattr(self, '介绍区布局'):
                self.初始化介绍区()
                #起始接口.重新排列节点布局()

            self.介绍文本组件 = 基础文本组件(self.图形项属性.get('节点介绍'))
            self.介绍区布局.addItem(self.介绍文本组件)
            self.注册属性变动触发函数('节点介绍', self.介绍文本组件.设置文本)
            日志记录器.info("介绍区组件加载完成, 内容: %s", self.图形项属性.get('节点介绍'))

    def 加载容器区组件(self):
        pass
    def 加载连接区组件(self):
        日志记录器.debug("加载连接区组件")
        # 连接区可选
        # 执行流 调用流 
        self.初始连接区_状态输入()
        self.初始连接区_状态输出()
        self.注册属性变动触发函数('执行流输入', self.初始连接区_状态输入)
        self.注册属性变动触发函数('执行流输出', self.初始连接区_状态输出)
        self.注册属性变动触发函数('调用流输入', self.初始连接区_状态输入)
        self.注册属性变动触发函数('调用流输出', self.初始连接区_状态输出)
        # 数据流
        self.初始连接区_数据输入()
        self.初始连接区_数据输出()

        self.注册属性变动触发函数('数据流输入', self.初始连接区_数据输入)
        self.注册属性变动触发函数('数据流输出', self.初始连接区_数据输出)

        if (not self.图形项属性.get('参数名') is None) or (not self.图形项属性.get('参数值') is None):
            if hasattr(self, '参数布局'):
                raise ValueError("参数布局重复初始化！")
            else:
                self.参数布局 = QGraphicsLinearLayout(Qt.Horizontal)# 布局方向为垂直
                self.参数布局.setContentsMargins(0, 0, 0, 0)
                #起始接口.参数布局.setAlignment(Qt.AlignLeft)
            if not self.图形项属性.get('参数名') is None:
                参数名组件 = 基础文本组件(self.图形项属性.get('参数名'))
                self.注册属性变动触发函数('参数名', 参数名组件.设置文本)
                self.参数布局.addItem(参数名组件)
            if not self.图形项属性.get('参数值') is None:
                参数值组件 = 基础文本组件(self.图形项属性.get('参数值'),修改回调=self.获取属性值('参数值修改回调'))
                self.注册属性变动触发函数('参数值', 参数值组件.设置文本)
                self.参数布局.addItem(参数值组件)
        # else:
        #     raise ValueError("参数名与参数值都不存在")

            if not self.图形项属性.get('表格列名') is None:
                if hasattr(self, '数据容器布局'):
                    self.数据容器布局.clear()

                self.数据容器布局 = QGraphicsLinearLayout(Qt.Vertical)
                self.数据容器布局.setContentsMargins(0, 0, 0, 0)
                #起始接口.数据容器布局.setAlignment(Qt.AlignLeft)

                self.连接区布局.addItem(self.参数布局, 0, 1, 1, 1, Qt.AlignCenter)
                self.连接区布局.addItem(self.数据容器布局, 1, 1, 1, 1, Qt.AlignCenter)
            else:
                # 参数区占据第二列的两行
                self.连接区布局.addItem(self.参数布局, 0, 1, 2, 1, Qt.AlignCenter)


    def 初始连接区_数据输入(self):
        日志记录器.debug("初始化连接区-数据输入")
        if not self.图形项属性.get('数据流输入') is None:  # 控制输入存在的话
            if not hasattr(self, '数据输入布局'):
                self.数据输入布局 = QGraphicsLinearLayout(Qt.Vertical)
                self.数据输入布局.setContentsMargins(0, 0, 0, 0)
            else:
                self.清空布局(self.数据输入布局)
            #起始接口.数据输入布局.setAlignment(Qt.AlignLeft)
            for 接口模型 in self.获取属性("数据流输入"):  # 输入是个列表
                if 接口模型.图形项 is None:
                    self.数据输入布局.addItem(接口图形项(接口模型))
                else:
                    self.数据输入布局.addItem(接口模型.图形项)


            if self.数据输入布局.count() > 0:
                if not self.连接区布局.itemAt(1, 0) is None:
                    return
                self.连接区布局.addItem(self.数据输入布局, 1, 0, 1, 1, Qt.AlignLeft)
                日志记录器.info("数据输入组件加载完成")


    def 初始连接区_数据输出(self):
        日志记录器.debug("初始化连接区-数据输出")
        if not self.图形项属性.get('数据流输出') is None:  # 控制输出存在的话
            if not hasattr(self, '数据输出布局'):
                self.数据输出布局 = QGraphicsLinearLayout(Qt.Vertical)
                self.数据输出布局.setContentsMargins(0, 0, 0, 0)
            else:
                self.清空布局(self.数据输出布局)
            #起始接口.数据输出布局.setAlignment(Qt.AlignLeft)
            端口模型=self.获取属性("数据流输出")
            if 端口模型.图形项 is None:
                self.数据输出布局.addItem(接口图形项(端口模型))

            else:
                self.数据输出布局.addItem(端口模型.图形项)

            if self.数据输出布局.count() > 0:
                if not self.连接区布局.itemAt(1, 2) is None:
                    return
                self.连接区布局.addItem(self.数据输出布局, 1, 2, 1, 1, Qt.AlignRight)
                日志记录器.info("数据输出组件加载完成")

    def 初始连接区_状态输入(self):
        日志记录器.debug("初始化连接区-状态输入")
        if self.获取属性('执行流输入') is not None or self.获取属性('调用流输入') is not None :
            if not hasattr(self, '状态输入布局'):
                self.状态输入布局 = QGraphicsLinearLayout(Qt.Vertical)
                self.状态输入布局.setContentsMargins(0, 0, 0, 0)
                #起始接口.状态输入布局.setAlignment(Qt.AlignLeft)
            else:
                self.清空布局(self.状态输入布局)
            执行流端口模型 = self.获取属性("执行流输入")
            调用流端口模型=self.获取属性("调用流输入")
            if 执行流端口模型 is not None:
                if 执行流端口模型.图形项 is None:

                    self.状态输入布局.addItem(接口图形项(执行流端口模型))

                else:
                    self.状态输入布局.addItem(执行流端口模型.图形项)
            if 调用流端口模型 is not None:
                if 调用流端口模型.图形项 is None:
                    self.状态输入布局.addItem(接口图形项(调用流端口模型))

                else:
                    self.状态输入布局.addItem(调用流端口模型.图形项)
            if self.状态输入布局.count() > 0:
                if not self.连接区布局.itemAt(0, 0) is None:
                    return
                self.连接区布局.addItem(self.状态输入布局, 0, 0, 1, 1, Qt.AlignLeft)
                日志记录器.info("状态输入组件加载完成")

    def 初始连接区_状态输出(self):
        日志记录器.debug("初始化连接区-状态输出")
        if self.获取属性('执行流输出') is not None or self.获取属性('调用流输出') is not None:  # 状态输出存在的话
            if not hasattr(self, '状态输出布局'):
                self.状态输出布局 = QGraphicsLinearLayout(Qt.Vertical)
                self.状态输出布局.setContentsMargins(0, 0, 0, 0)
            else:
                self.清空布局(self.状态输出布局)
            #起始接口.状态输出布局.setAlignment(Qt.AlignLeft)

            执行流端口模型 = self.获取属性("执行流输出")
            # 调用流端口模型=self.获取属性("调用流输出")
            if 执行流端口模型.图形项 is None:
                self.状态输出布局.addItem(接口图形项(执行流端口模型))

            else:
                self.状态输出布局.addItem(执行流端口模型.图形项)
            # if 调用流端口模型.图形项 is None:
            #     self.状态输出布局.addItem(接口图形项(调用流端口模型))
            # else:
            #     self.状态输出布局.addItem(调用流端口模型.图形项)
            if self.状态输出布局.count() > 0:
                if not self.连接区布局.itemAt(0, 2) is None:
                    return
                self.连接区布局.addItem(self.状态输出布局, 0, 2, 1, 1, Qt.AlignRight)
                日志记录器.info("状态输出组件加载完成")
    def 清空布局(self,布局):
        # 遍历并移除所有子项
        while 布局.count() > 0:
            item = 布局.itemAt(0)  # 获取第一个子项
            布局.removeItem(item)  # 从布局中移除子项
    def 刷新接口(self):
        接口模型=self.获取属性('执行流输入')
        if 接口模型 is not None:
            接口模型.刷新接口()
        接口模型=self.获取属性('执行流输出')
        if 接口模型 is not None:
            接口模型.刷新接口()
        接口模型=self.获取属性('调用流输入')
        if 接口模型 is not None:
            接口模型.刷新接口()
        接口模型=self.获取属性('调用流输出')
        if 接口模型 is not None:
            接口模型.刷新接口()
        接口模型=self.获取属性('数据流输入')
        if 接口模型 is not None:
            for 接口 in 接口模型:
                接口.刷新接口()
        接口模型=self.获取属性('数据流输出')
        if 接口模型 is not None:
            接口模型.刷新接口()